function sum(a, b) {
  return a + b;
}
const p = new Proxy(sum, {
  /**
   *
   * @param {*} target 源函数
   * @param {*} thisArg proxy上下文对象,就是p代理对象的this,p是函数调用,p的this指向
   * @param {*} args 调用p时传的参数
   * apply 中的this 如果是普通函数,this指向的是谁调用的apply方法也就是当前proxy
   * 如果是箭头函数,this指向的是父级程序的this
   */
  apply: function (target, thisArg, args) {
    console.log(target, thisArg, args, this);
    return (args[0] + args[1]) * 10;
  },
  set: () => {
    console.log('set');
  },
});

console.log('源函数的结果: ==>', sum(1, 2));
console.log('调用proxy代理对象函数的结果 ==>', p(1, 2)); // 可以被拦截
window.pp = p;
window.pp(1, 2); // 可以被拦截,thisArg指向window

p.apply({ name: 'apply' }, [1, 2]); // 可以被拦截,thisArg指向{ name: 'apply' }

p.call({ name: 'call' }, 1, 2); // 可以被拦截,thisArg指向{ name: 'call' }

p.bind({ name: 'bind' })(1, 2); // 可以被拦截,thisArg指向{ name: 'bind }
